# 1.字符串编码
# 编码       制定时间      作用                                  所占字节数
# ASCII     1967年       表示英语及西欧语言                         8bit/1bytes
# GB2312    80年         国家简体中文字符集，兼容ASC                 2bytes
# Unicode   1991年       国际标准组织统一标准字符集                  2bytes
# GBK       1995年       GB2312的扩展字符集，支持擎体字，兼容GB2312   2bytes
# UTF-8     1992年       不定长编码                               1-3bytes

# unicode 所有字符都是2个字节，字符与数值解之间转换速度快，但是占用空间大
# UTF-8 精准，对不同的字符用不同的长度表示，节省空间，占用空间小，字符与数字的转换速度较慢，每次都需要计算字符需要用到多少个字节表示。

# 1.1字符串编码转换
#   1.编码 encode()  将其他编码的字特串转换成Unicode编码
#   2.解码 decode()  将Unicode编码转换成其他编码的字符串
a = "hello"
print(a, type(a))  # hello <class 'str'>
a1 = a.encode()  # 编码
print(a1, type(a1))  # b'hello' <class 'bytes'>,以字节为单位进行处理
a2 = a1.decode()  # 解码
print(a2, type(a2))  # hello <class 'str'>

print()
str = a.encode("utf-8")  # utf-8编码
print(str, type(str))  # b'hello' <class 'bytes'>
str1 = str.decode("utf-8")  # utf-8解码
print(str1, type(str1))  # hello <class 'str'>

# 1.2 字符串常见操作
# + 字符串拼接
print(10 + 10)  # 20 整形相加 （+是算数运算符）
print("10" + "10")  # 1010 字符串相加 （+是字符串拼接）
name1 = "hello"
name2 = "world"
print(name1, name2, sep=" ")  # hello world

# * 重复输出
print()
print(10 * 2)  # 20
print("10" * 2)  # 重复输出 需要输出多少次，* 后边就写几

# 成员运算符 检查字符串是否包含了某个或多个字符
# in 如果包含，返回True,不包含返回False
# not in 如果不包含返回True,包含返回False
print()
name = "bingbing"
print('b' in name)  # True
print('a' in name)  # False
print('b' not in name)  # False
print('a' not in name)  # True
print('bin' in name)  # True

# 1.3 下标/索引
# python 中下标从0开始
# 写法：字符串名[下标值]
# 注意：从右往左数，下标是从-1开始，-1，-2，-3
print()
name = "sixstar"
print(name[0])  # s
# print(name[1])
# print(name[2])
# print(name[7]) #string index out of range
print(name[-1])  # r 从右往左
print(name[-2])  # a 从右往左
print(name[-7])  # s 从右往左
# print(name[-8]) #超出索引范围

# 切片
# 指对操作的对象截取其中一部分的操作
# 语法：[开始位置:结束位置] 包前不包后(不包含结束位本身) 下标从0开始
str = "abcdefg"
# print(str[0:4]) #abcd
# print(str[4:7]) #efg
# print(str[3:]) #defg  下标为3之后的全部截取到
# print(str[:6]) #abcdef 下标为6以前的全部截取到

# print(str[:-1]) #abcdef 从开始到结束
print()
print(str[-1:])  # g
print(str[-1:-5])  # 为空
# 步长：表示选取间隔，不写步长默认是1
# 步长的绝对值决定窃取的间隔，正负号决定切取反向，
# 正数表示从左往右，负数表示从右往左
# 当 step > 0（正数）时，切片方向为从左向右，此时要求 start < end，否则结果为空。
# 当 step < 0（负数）时，切片方向为从右向左，此时要求 start > end，否则结果为空

# [start:end:step]
st = "abcdefghijk"
print(st[-1::-1])  # kjihgfedcba
print(st[-1::1])  # k
print(st[-1:-5:-1])  # kjih
print(st[0:7:2])  # aceg 2是步长
print(st[0:7:3])  # adg 3是步长
